package com.yinsw.config;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * Jwt工具类
 *
 * @author muyu
 */
@Configuration
public class JwtUtils {

    /**
     * 令牌秘钥
     */
    public final static String SECRET = "abcdefghijklmnopqrstuvwxyz";

    /**
     * 用户ID字段
     */
    public static final String USER_ID = "user_id";

    /**
     * 用户名字段
     */
    public static final String USER_NAME = "user_name";

    /**
     * 用户名手机号
     */
    public static final String USER_TEL = "user_tel";

    /**
     * 用户名身份证号
     */
    public static final String ID_CARD = "id_card";

    /**
     * token标识
     */
    public static final String TOKEN = "token";

    /**
     * 登录用户
     */
    public static final String LOGIN_NAME = "login_name";

    /**
     * 登录前缀
     */
    public static final String LOGIN_TOKEN = "token:";



    public static String secret = SECRET;

    /**
     * 从数据声明生成令牌
     *
     * @param claims 数据声明
     * @return 令牌
     */
    public static String createToken(Map<String, Object> claims){
        String token = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, secret).compact();
        return token;
    }

    /**
     * 从令牌中获取数据声明
     *
     * @param token 令牌
     * @return 数据声明
     */
    public static Claims parseToken(String token){
        return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
    }

    /**
     * 根据令牌获取用户ID
     *
     * @param token 令牌
     * @return 用户ID
     */
    public static String getUserId(String token){
        Claims claims = parseToken(token);
        return getValue(claims, USER_ID);
    }

    /**
     * 根据身份信息获取用户ID
     *
     * @param claims 身份信息
     * @return 用户ID
     */
    public static String getUserId(Claims claims){
        return getValue(claims, USER_ID);
    }

    /**
     * 根据令牌获取用户名
     *
     * @param token 令牌
     * @return 用户名
     */
    public static String getUserName(String token){
        Claims claims = parseToken(token);
        return getValue(claims, USER_NAME);
    }

    /**
     * 根据身份信息获取用户名
     *
     * @param claims 身份信息
     * @return 用户名
     */
    public static String getUserName(Claims claims){
        return getValue(claims, USER_NAME);
    }

    /**
     * 获取用户名称
     * @param token
     * @return
     */
    public static String getLoginUser(String token) {
        Claims claims = parseToken(token);
        return getValue(claims , LOGIN_NAME);
    }

    /**
     * 获取用户名称
     * @param claims
     * @return
     */
    public static String getLoginUser(Claims claims) {
        return getValue(claims , LOGIN_NAME);
    }

    /**
     * 根据身份信息获取键值
     *
     * @param claims 身份信息
     * @param key 键
     * @return 值
     */
    public static String getValue(Claims claims, String key){
        return claims.get(key).toString();
    }

}
